package com.itheima.reggie.controlle;

import com.itheima.reggie.common.R;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.util.UUID;

/**
 * 处理文件上传下载
 */
@RestController
@RequestMapping("common")
public class CommonController {

    @Value("${reggie.path}")
    private String T_PATH;
    /**
     * 文件上传逻辑
     * 返回值字符串 需要返回文件名到前端才可以下载
     *  参数 MultipartFile spring集成的数据传输接口 参数名不能乱写 要和前端name值一样 默认值file
     */
    @PostMapping("/upload")
    public R<String> upload(MultipartFile file){
        //首先判断存储文件指定位置是否存在 如果不存在则创建
        //创建file 拿到文件位置对象
        File T_PATHFile = new File(T_PATH);
        //判断是否存在
        if(!T_PATHFile.exists()){
            //不存在则创建
            T_PATHFile.mkdir();
        }

        //到这说明存储文件位置存在
        //文件名不可重复需要截取后缀然后拼接uuid唯一字符串
        //截取后缀
        String originalFilename = file.getOriginalFilename();
        String fileO = originalFilename.substring(originalFilename.lastIndexOf("."));
        //创建uuid对象并拼接
        String fileName = UUID.randomUUID()+fileO;

        //把fileName转存到指定位置
        try {
            file.transferTo(new File(T_PATH,fileName));
        } catch (Exception e) {
            e.printStackTrace();
        }
        //返回文件名
        return R.success(fileName);
    }

    /**
     * 文件下载
     * 没有返回值 因为resp返回了数据
     * 参数为name 文件全名
     */
    @GetMapping("/download")
    private void download(@RequestParam("name") String fileName,
                          HttpServletResponse response){
        //文件到浏览器的上传和下载 使用字符的输入输出流 输入流自己创建 输出流到浏览器可以使用resp的输出流实现
        try {
            //创建字节输入流对象
            FileInputStream fis = new FileInputStream(new File(T_PATH, fileName));
            //创建字节输出流
            ServletOutputStream os = response.getOutputStream();
            //拷贝
            IOUtils.copy(fis,os);
            //释放资源
            fis.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
